package com.hmbe.utils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;

/**
 * 全局ID生成器
 * 使用Redis自增+每日一个订单编号+时间戳的方式生成全局唯一ID
 */
@Component
public class IDGenUtil {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;


    /**
     * 日期格式化器，用于生成每日订单编号前缀
     */
    private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd");

    /**
     * 生成全局唯一ID
     * 格式：yyyyMMdd + Redis自增序列号 + 时间戳后6位
     *
     * @param keyPrefix 业务前缀，用于区分不同业务类型的ID
     * @return 全局唯一ID
     */
    public String generateId(String keyPrefix) {
        // 1. 获取当前日期作为订单编号前缀
        LocalDate now = LocalDate.now();
        String datePrefix = now.format(DATE_FORMATTER);

        // 2. 使用Redis自增获取当天的序列号
        String redisKey = RedisConstants.ID_GENERATOR_KEY + keyPrefix + ":" + datePrefix;
        Long increment = stringRedisTemplate.opsForValue().increment(redisKey);

        // 3. 获取当前时间戳（秒级）的后6位
        long timestamp = LocalDateTime.now().toEpochSecond(ZoneOffset.UTC);
        String timestampSuffix = String.valueOf(timestamp).substring(Math.max(0, String.valueOf(timestamp).length() - 6));

        // 4. 拼接最终的ID：日期前缀 + 序列号（补齐5位） + 时间戳后6位
        return datePrefix + String.format("%05d", increment) + timestampSuffix;
    }

}
